1 Introduction

This data report uses two different datasets to estimate the greenhouse gas emissions of the Hampshire County under three different definitions:

  • total annual CO2 emissions for the period 2005 to 2019 using local authority level data from BEIS
  • total annual CO2e emissions (i.e. all emissions, including CH4 and others) using the territorial emissions method with data from the Centre for Sustainable Energy’s Impact Tool at the local authority level
  • total annual CO2e emissions (i.e. all emissions, including CH4 and others) using the consumption emissions method with data from the Centre for Sustainable Energy’s Impact Tool at the local authority level

For the avoidance of doubt the Hampshire County is taken to mean all local authority districts in the Hampshire County including the unitary authorities of Portsmouth, Southampton and the Isle of Wight.

2 Data

# BEIS LA co2 data
beis_la_co2_DT <- data.table::fread(paste0(params$dataPath,
 "beis/localAuthorityCarbon/",                                "2005-19_Local_Authority_CO2_emissions.csv"))

beis_la_co2_DT[, subSectorLabel := `LA CO2 Sub-sector`]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Agriculture",
     "Industry: Agriculture",
     subSectorLabel)
     ]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Large Industrial Installations",
     "Industry: Large Industrial Installations",
     subSectorLabel)
]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Road Transport (A roads)",
     "Transport: (A roads)",
     subSectorLabel)
]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Road Transport (Minor roads)",
     "Transport: (Minor roads)",
     subSectorLabel)
]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Road Transport (Motorways)",
     "Transport: (Motorways)",
     subSectorLabel)
]
beis_la_co2_DT[, subSectorLabel := ifelse(subSectorLabel == "Diesel Railways",
     "Transport: Diesel Railways",
     subSectorLabel)
]
beis_la_co2_DT[, la_name := `Local Authority`]


# set up the colours

# colours borrowed from https://git.soton.ac.uk/twr1m15/la_emissions_viz/-/blob/master/shiny/app.R
# for details, use set for each sector
industry_pal <- RColorBrewer::brewer.pal(n = 8, name = "Greys")[4:8]    # industry greys, 5 categories incl Agric
commercial_pal <- RColorBrewer::brewer.pal(n = 8, name = "RdPu")[4:6]    # commercial greys, 3 categories
domestic_pal <- RColorBrewer::brewer.pal(n = 4, name = "Blues")[2:4]    # domestic blues, 3 categories
public_pal <- RColorBrewer::brewer.pal(n = 4, name = "Purples")[2:4]    # public purple, 3 categories
transport_pal <- RColorBrewer::brewer.pal(n = 6, name = "Oranges")[2:6] # transport oranges, 5 categories
lulucf_pal <- RColorBrewer::brewer.pal(n = 9, name = "Greens")[4:9]     # lulucf greens, 6 categories

# for details, combine sets
detailed_pal <- c(commercial_pal, domestic_pal, industry_pal, lulucf_pal, public_pal, transport_pal)

beis_la_co2_DT[, subSectorLabelFact := factor(subSectorLabel)]

catList <- unique(beis_la_co2_DT$subSectorLabelFact) # this is not alphabetical - why?

catList2 <- c(catList[1:15],catList[25] , catList[16:24])

names(detailed_pal) <- catList2

hampshire_beis_la_co2_DT <- getSolent(beis_la_co2_DT)

t <- hampshire_beis_la_co2_DT[, .('Number of emissions categories' = .N), keyby = .(District = la_name, Year = as.character(`Calendar Year`))]
makeFlexTable(dcast(t, District ~ Year), cap = "Data coverage for BEIS CO2 emissions data")
## Using 'Number of emissions categories' as value column. Use 'value.var' to override

Table 2.1 shows the numnber of emissions categories for each district over time. Where this value is less than 24 this implies some categories had no emissions for this district.

# CSE impact tool data
cse_territorial_abs_DT <- data.table::fread(paste0(params$dataPath,
 "cse/cse_ImpactTool/",                                "local-authority-all-territorial-absolute.csv.gz"))
cse_territorial_abs_DT[, la_name := name]
hampshire_cse_territorial_abs_DT <- getSolent(cse_territorial_abs_DT)

# make long form for easy summary etc
hampshire_cse_territorial_abs_DT <- melt(hampshire_cse_territorial_abs_DT)
## Warning in melt.data.table(hampshire_cse_territorial_abs_DT): id.vars and
## measure.vars are internally guessed when both are 'NULL'. All non-numeric/
## integer/logical type columns are considered id.vars, which in this case are
## columns [id, name, la_name, ...]. Consider providing at least one of 'id' or
## 'measure' vars in future.
t <- hampshire_cse_territorial_abs_DT[, .('Number of emissions categories' = .N), keyby = .(District = la_name)]
makeFlexTable(t, cap = "Data coverage for CSE territorial emissions data")
cse_consumption_abs_DT <- data.table::fread(paste0(params$dataPath,
 "cse/cse_ImpactTool/",                                "local-authority-all-consumption-absolute.csv.gz"))
cse_consumption_abs_DT[, la_name := name]
hampshire_cse_consumption_abs_DT <- getSolent(cse_consumption_abs_DT)

# make long form for easy summary etc
hampshire_cse_consumption_abs_DT <- melt(hampshire_cse_consumption_abs_DT)
## Warning in melt.data.table(hampshire_cse_consumption_abs_DT): id.vars and
## measure.vars are internally guessed when both are 'NULL'. All non-numeric/
## integer/logical type columns are considered id.vars, which in this case are
## columns [id, name, la_name, ...]. Consider providing at least one of 'id' or
## 'measure' vars in future.
t <- hampshire_cse_consumption_abs_DT[, .('Number of emissions categories' = .N), keyby = .(District = la_name)]
makeFlexTable(t, cap = "Data coverage for CSE consumptions emissions data")

3 Territorial CO2 emissions only (BEIS data)

These are calculated under the territorial emissions method and include only CO2 emissions.

3.1 Totals for ‘Hampshire’

Table 3.1 shows the total emissions for 2019.

t <- hampshire_beis_la_co2_DT[`Calendar Year` == 2019, .(`Total kT CO2e` = sum(`Territorial emissions (kt CO2)`, na.rm = TRUE))]
makeFlexTable(t, cap = "BEIS CO2 emissions (kT, Hampshire, 2019)")
sumBEIS_kt <- sum(hampshire_beis_la_co2_DT[`Calendar Year` == 2019]$`Territorial emissions (kt CO2)`)

Table 3.2 shows the total emissions for 2019 by category. Figure 3.1 shows the data as a bar plot. The categroies have been colour-coded so that related categories have similar colours in the palette. The largest emissions sources under this method are clearly visible (domestic gas and transport).

t <- hampshire_beis_la_co2_DT[`Calendar Year` == 2019, .(`Total kT CO2` = sum(`Territorial emissions (kt CO2)`, na.rm = TRUE)), keyby = .(subSectorLabelFact)]

absTotal <- sum(hampshire_beis_la_co2_DT[`Calendar Year` == 2019, abs(`Territorial emissions (kt CO2)`)])
                
t[, `% of gross` := 100*(`Total kT CO2`/absTotal)]

makeFlexTable(t, cap = "BEIS CO2 emissions by category (Hampshire, 2019)")
ggplot2::ggplot(t, aes(x = reorder(subSectorLabelFact, -`Total kT CO2`), 
                       y = `Total kT CO2`,
                       fill = subSectorLabelFact)) +
  geom_col() +
  scale_fill_manual(values = detailed_pal) +
  theme(legend.position = "none") +
  labs(x = "LA CO2 Sub-sector") +
  coord_flip()
BEIS CO2 emissions by category (Hampshire, 2019 ordered by emissions value)

Figure 3.1: BEIS CO2 emissions by category (Hampshire, 2019 ordered by emissions value)

# p <- ggplot2::ggplot(subsetDT, aes(x = `Calendar Year`, y = `Territorial emissions (kt CO2)`,
#                             fill = subSectorLabel,
#                             colour = subSectorLabel)) +
#   geom_col(position = "stack") +
#   scale_colour_manual(values = detailed_pal) +
#   scale_fill_manual(values = detailed_pal) #
# p

Figure 3.2 shows trends over time for these categories.

t <- hampshire_beis_la_co2_DT[, .(`Total kT CO2e` = sum(`Territorial emissions (kt CO2)`, na.rm = TRUE)), keyby = .(`Calendar Year`, subSectorLabelFact)]

ggplot2::ggplot(t, aes(x = `Calendar Year`, 
                       y = `Total kT CO2e`,
                       fill = subSectorLabelFact)) +
  geom_col(position = "stack") +
  scale_fill_manual(values = detailed_pal) +
  theme(legend.position = "bottom", ) +
  guides(fill=guide_legend(ncol=3)) +
  theme(legend.title = element_blank()) +
  labs(x = "LA CO2 Sub-sector")
BEIS CO2 emissions by category (Hampshire, 2019 ordered by emissions value)

Figure 3.2: BEIS CO2 emissions by category (Hampshire, 2019 ordered by emissions value)

Figure 3.3 shows trends over time for these categories using a line plot to make it easier to see which categories have declined.

p <- ggplot2::ggplot(t, aes(x = `Calendar Year`, 
                       y = `Total kT CO2e`,
                       colour = subSectorLabelFact)) +
  geom_line() +
  scale_colour_manual(values = detailed_pal) +
  theme(legend.position = "bottom", ) +
  guides(colour=guide_legend(ncol=3)) +
  theme(legend.title = element_blank()) +
  labs(x = "LA CO2 Sub-sector")

p
BEIS CO2 emissions by category (Hampshire, 2019 ordered by emissions value)

Figure 3.3: BEIS CO2 emissions by category (Hampshire, 2019 ordered by emissions value)

Figure 3.4 shows the same plot using plotly so that you can hover over the lines. This only works if the output is html and you are viewing this in a web browser…

library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following objects are masked from 'package:flextable':
## 
##     highlight, style
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
plotly::ggplotly(p)

Figure 3.4: BEIS CO2 emissions by category (Hampshire, 2019 ordered by emissions value)

3.2 Totals for local authority districts

To do

4 Territorial-based emissions (CSE data)

These are calculated under the territorial emissions method and include all greenhouse gas emissions.

4.1 Totals for ‘Hampshire’

Table 4.1 shows the total emissions for 2019.

t <- hampshire_cse_territorial_abs_DT[, .(`Total kT CO2e` = sum(value, na.rm = TRUE)/1000)]
makeFlexTable(t, cap = "CSE territorial emissions (Hampshire, 2019)")
sumCSETerr_kt <- sum(hampshire_cse_territorial_abs_DT$value)/1000

Table 4.2 shows the total emissions for 2019 by category. Figure 4.1 shows the data as a bar plot. The largest emissions sources under this method are clearly visible (domestic gas, transport and pwoer generation). Note that some of the categories do not exactly match those used in the BEIS data. Ignore the (t CO2e) in the label - the plot shows kT for easy comparison.

t <- hampshire_cse_territorial_abs_DT[, .(`Total kT CO2e` = sum(value, na.rm = TRUE)/1000), keyby = .(variable)]

absTotal <- sum(hampshire_cse_territorial_abs_DT[, abs(value)])/1000
                
t[, `% of gross` := 100*(`Total kT CO2e`/absTotal)]

makeFlexTable(t, cap = "CSE all territorial emissions by category (Hampshire, 2019)")
ggplot2::ggplot(t, aes(x = reorder(variable, -`Total kT CO2e`), 
                       y = `Total kT CO2e`,
                       fill = variable)) +
  geom_col() +
  #scale_fill_manual(values = detailed_pal) +
  theme(legend.position = "none") +
  labs(x = "Emissions source") +
  coord_flip()
CSE all territorial emissions by category (Hampshire, 2019 ordered by emissions value)

Figure 4.1: CSE all territorial emissions by category (Hampshire, 2019 ordered by emissions value)

# p <- ggplot2::ggplot(subsetDT, aes(x = `Calendar Year`, y = `Territorial emissions (kt CO2)`,
#                             fill = subSectorLabel,
#                             colour = subSectorLabel)) +
#   geom_col(position = "stack") +
#   scale_colour_manual(values = detailed_pal) +
#   scale_fill_manual(values = detailed_pal) #
# p

5 Consumption-based emissions (CSE data)

These are calculated under the consumption emissions method and include all greenhouse gas emissions.

5.1 Totals for ‘Hampshire’

Table 5.1 shows the total emissions for 2019.

t <- hampshire_cse_consumption_abs_DT[, .(`Total kT CO2e` = sum(value, na.rm = TRUE)/1000)]
makeFlexTable(t, cap = "CSE consumption emissions (Hampshire, 2019)")
sumCSECons_kt <- sum(hampshire_cse_consumption_abs_DT$value)/1000

Table 5.2 shows the total emissions for 2019 by category. Figure 5.1 shows the data as a bar plot. The largest emissions sources under this method are clearly visible (purchased goods, services and food/diet and gas-use). Note that some of the categories do not exactly match those used in the BEIS data. Ignore the (t CO2e) in the label - the plot shows kT for easy comparison.

t <- hampshire_cse_consumption_abs_DT[, .(`Total kT CO2e` = sum(value, na.rm = TRUE)/1000), keyby = .(variable)]

absTotal <- sum(hampshire_cse_consumption_abs_DT[, abs(value)])/1000
                
t[, `% of gross` := 100*(`Total kT CO2e`/absTotal)]

makeFlexTable(t, cap = "CSE all consumption emissions by category (Hampshire, 2019)")
ggplot2::ggplot(t, aes(x = reorder(variable, -`Total kT CO2e`), 
                       y = `Total kT CO2e`,
                       fill = variable)) +
  geom_col() +
  #scale_fill_manual(values = detailed_pal) +
  theme(legend.position = "none") +
  labs(x = "Emissions source") +
  coord_flip()
CSE all territorial emissions by category (Hampshire, 2019 ordered by emissions value)

Figure 5.1: CSE all territorial emissions by category (Hampshire, 2019 ordered by emissions value)

6 Summary

The true value of emissions for Hampshire depends how you measure it:

  • BEIS territorial CO2 only: 8,421.445 kT
  • CSE territorial emissions: 14,388.88 kT
  • CSE consumption emissions: 13,633.33 kT

Which you choose to focus on depends what you want to show and what you want to achieve. The same is true of the emissions subcategories.

For strategic planning purposes the next step is to map relevant policies to the categories of emissions. Which gaps can be filled and by whom?

7 End